package com.example.test_2_1_transaction.controller;

import com.example.test_2_1_transaction.service.UserService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.datasource.DataSourceTransactionManager;
import org.springframework.transaction.TransactionDefinition;
import org.springframework.transaction.TransactionStatus;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@Slf4j
@RequestMapping("/user")
@RestController
public class UserController {
    // 注入事务管理器, 这个是Spring自带的
    @Autowired
    private DataSourceTransactionManager dataSourceTransactionManager; // 提前配置好的
    // 事务管理器

    // 还需要一些配置
    // 同样也提供了 默认的配置属性
    @Autowired
    private TransactionDefinition transactionDefinition;
    @Autowired
    private UserService userService;
    @RequestMapping("/registry")
    public String registry(String userName, String password){
        // 开启事务
        // 通过 dataSourceTransactionManager 获取当前的事务
        TransactionStatus transaction = dataSourceTransactionManager.getTransaction(transactionDefinition);
        // 获取当前事务  需要传递参数 transactionDefinition , 这个是已经配置好的

        Integer result = userService.insertUser(userName,password);

        log.info("用户插入成功, result:"+result);

//        // 回滚事务
//        dataSourceTransactionManager.rollback(transaction); // 直接回滚
        // 也需要传递参数, 传递的是, 获取当前的事务步骤所返回的结果 transaction
        // 回滚到上一个状态


        // 接下来开始测试运行
        // 输入用户名密码之后 执行成功了
        // 但是在数据库中还是没有对应的信息. 数据库并没有操作成功
        // 因为数据发生了回滚
        // 这就是 事务的回滚

        // 接下来把 回滚操作注解掉之后
        // 进行 提交事务的操作
        dataSourceTransactionManager.commit(transaction); // 这就是提交事务

        // 这时候测试运行之后
        // 数据库上面也存在了

        // 但是这时候 id 变成 2 了
        // 因为上次的操作进行回滚了,
        // 说明上一条数据是已经插入成功的 只不过是 进行回滚了, 留下了一点痕迹

        // 提交和回滚的差异就是
        // 运行之后 在控制台中显示的日志里面
        // 提交 有 提交的日志 , 然后关闭事务
        // 而 回滚没有 , 直接就是关闭事务了

        return "注册成功";
    }
}
